﻿//using System;
//using System.IO;
//using System.Threading;
//using System.Threading.Tasks;
//using System.Windows.Forms;
//using SHDocVw;
//using mshtml;
//using WebBrowser = System.Windows.Forms.WebBrowser;

//namespace DzInfo.Tools.Web
//{
//    public class WebPageToPdfConverter : IDisposable
//    {
//        private WebBrowser webBrowser;
//        private bool isDisposed;
//        private ManualResetEvent loadCompletedEvent;
//        private string pdfOutputPath;
//        private string errorMessage;
//        private bool conversionSuccess;

//        public WebPageToPdfConverter()
//        {
//            webBrowser = new WebBrowser();
//            webBrowser.ScriptErrorsSuppressed = true;
//            webBrowser.DocumentCompleted += WebBrowser_DocumentCompleted;
//            loadCompletedEvent = new ManualResetEvent(false);
//        }

//        public async Task<bool> ConvertUrlToPdfAsync(string url, string outputPath, int timeoutSeconds = 30, int waitAfterLoadSeconds = 5)
//        {
//            if (string.IsNullOrEmpty(url))
//                throw new ArgumentNullException(nameof(url));

//            if (string.IsNullOrEmpty(outputPath))
//                throw new ArgumentNullException(nameof(outputPath));

//            pdfOutputPath = outputPath;
//            errorMessage = string.Empty;
//            conversionSuccess = false;

//            try
//            {
//                // 确保在UI线程上执行浏览器操作
//                await Task.Factory.StartNew(() =>
//                {
//                    try
//                    {
//                        webBrowser.Navigate(url);

//                        // 等待页面加载完成或超时
//                        if (!loadCompletedEvent.WaitOne(TimeSpan.FromSeconds(timeoutSeconds)))
//                        {
//                            errorMessage = $"页面加载超时（{timeoutSeconds}秒）";
//                            return;
//                        }

//                        // 等待额外时间确保所有动态内容加载完成
//                        Thread.Sleep(TimeSpan.FromSeconds(waitAfterLoadSeconds));

//                        // 使用WebBrowser控件的ExecWB方法进行打印到PDF
//                        var webBrowserActiveX = webBrowser.ActiveXInstance as SHDocVw.IWebBrowser2;
//                        if (webBrowserActiveX != null)
//                        {
//                            object oTrue = true;
//                            object oFalse = false;
//                            object oOutputPath = pdfOutputPath;
//                            object oMissing = Type.Missing;

//                            // 设置打印选项为PDF
//                            webBrowserActiveX.ExecWB((SHDocVw.OLECMDID)OLECMDID.OLECMDID_PRINT, (SHDocVw.OLECMDEXECOPT)OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER, ref oOutputPath, ref oMissing);

//                            // 这里可能需要额外的等待或检查机制来确保PDF生成完成
//                            Thread.Sleep(2000); // 简单等待2秒，实际应用中可能需要更复杂的检查

//                            conversionSuccess = File.Exists(pdfOutputPath);
//                            if (!conversionSuccess)
//                            {
//                                errorMessage = "PDF生成失败，文件未创建";
//                            }
//                        }
//                        else
//                        {
//                            errorMessage = "无法获取WebBrowser的ActiveX实例";
//                        }
//                    }
//                    catch (Exception ex)
//                    {
//                        errorMessage = $"转换过程中发生错误: {ex.Message}";
//                    }
//                }, CancellationToken.None, TaskCreationOptions.None, TaskScheduler.FromCurrentSynchronizationContext());
//            }
//            catch (Exception ex)
//            {
//                errorMessage = $"执行转换任务时发生错误: {ex.Message}";
//            }

//            return conversionSuccess;
//        }

//        private void WebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
//        {
//            // 检查是否所有框架都已加载完成
//            if (webBrowser.ReadyState == WebBrowserReadyState.Complete && e.Url == webBrowser.Url)
//            {
//                // 检查页面是否包含AJAX加载的内容
//                bool isAjaxComplete = CheckAjaxCompletion();

//                if (isAjaxComplete)
//                {
//                    loadCompletedEvent.Set();
//                }
//            }
//        }

//        private bool CheckAjaxCompletion()
//        {
//            try
//            {
//                // 检查常见的AJAX加载指示器
//                IHTMLDocument2 doc = webBrowser.Document.DomDocument as IHTMLDocument2;
//                if (doc != null)
//                {
//                    // 修改：通过 all.tags 方法获取元素集合
//                    var loadingElements = doc.all.tags("div") as IHTMLElementCollection;
//                    if (loadingElements != null)
//                    {
//                        foreach (IHTMLElement element in loadingElements)
//                        {
//                            if (element.className != null &&
//                                (element.className.Contains("loading") ||
//                                 element.className.Contains("spinner")))
//                            {
//                                // 如果元素可见，则表示仍在加载中
//                                if (element.style.display != "none")
//                                {
//                                    return false;
//                                }
//                            }
//                        }
//                    }

//                    // 检查jQuery的AJAX状态
//                    if (doc.parentWindow != null)
//                    {
//                        try
//                        {
//                            object active = doc.parentWindow.execScript("return jQuery.active", "javascript");
//                            if (active is int && (int)active > 0)
//                            {
//                                return false;
//                            }
//                        }
//                        catch { /* 忽略错误 */ }
//                    }
//                }

//                return true;
//            }
//            catch
//            {
//                // 发生异常时，保守地认为页面还未完全加载
//                return false;
//            }
//        }

//        public string GetErrorMessage()
//        {
//            return errorMessage;
//        }

//        public void Dispose()
//        {
//            Dispose(true);
//            GC.SuppressFinalize(this);
//        }

//        protected virtual void Dispose(bool disposing)
//        {
//            if (!isDisposed)
//            {
//                if (disposing)
//                {
//                    if (webBrowser != null)
//                    {
//                        webBrowser.DocumentCompleted -= WebBrowser_DocumentCompleted;
//                        webBrowser.Dispose();
//                        webBrowser = null;
//                    }

//                    if (loadCompletedEvent != null)
//                    {
//                        loadCompletedEvent.Dispose();
//                        loadCompletedEvent = null;
//                    }
//                }

//                isDisposed = true;
//            }
//        }
//    }
//    // OLECMDID枚举定义
//    public enum OLECMDID
//    {
//        OLECMDID_PRINT = 6,
//        // 其他可能需要的命令ID
//    }

//    public enum OLECMDEXECOPT
//    {
//        OLECMDEXECOPT_DONTPROMPTUSER = 2,
//        // 其他可能需要的选项
//    }
//}
